/**
 * 
 */
package kr.pe.johnkim.dayve.activity;

import java.io.IOException;

import org.json.JSONException;

import kr.pe.johnkim.dayve.provider.DayveGroup;
import kr.pe.johnkim.dayve.provider.DayveLog;
import kr.pe.johnkim.dayve.rest.DayveCategoryRest;
import kr.pe.johnkim.dayve.rest.DayveCommonRest;
import kr.pe.johnkim.dayve.rest.DayveGroupRest;
import kr.pe.johnkim.dayve.util.DayveCommon;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

/**
 * My History Group 을 생성하는 클래스 이다.
 * 
 * @author johnkim
 *
 */
public class DayveGroupRegisterView extends Activity {

	public static final String TAG = DayveGroupRegisterView.class.getSimpleName();
	
	ProgressBar registerGroupProgressBar;
	
	// 현재 시간.
	private String currentDate;
	
	// 아이콘 선택 화살표.
	ImageView imgViewGroupIconSelect;
	
	// 아이콘 선택.
	ImageView imgViewRegisterGroupSelectIcon;
	
	// 선택한 아이콘 파일 명.
	public static String DAYVE_GROUP_ICON_NAME = "dayve_group_default";
	
	// Group Name 입력란.
	EditText edtTextRegisterGroupName;
	
	// Group Name 중복 검사 버튼.
	Button btnCheckDuplicationRegisterGroup;
	
	// 입력 Comment 글자수 체크.
	TextView txtViewRegisterGroupCommentCount;
	
	// Group Comment 입력란.
	EditText edtTextRegisterGroupComment;
	
	// Group 등록 버튼.
	Button btnRegisterGroup;

	// Group Name 중복 검사를 한다.
	private static final int THREAD_CHECK_DUPLICATION = 101;
	
	// Group 을 등록 한다.
	private static final int THREAD_GROUP_REGISTER = 102;
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 103;
	
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 104;
	
	// Group 저장 성공하면 토스트를 띄운다.
	private static final int THREAD_PROGRESS_REGISTER_SUCCESS = 105;
	
	// Group 저장 실패하면 오류발생 다이얼로그 창을 띄운다.
	private static final int THREAD_PROGRESS_REGISTER_FAIL = 106;
	
	// Group Name 중복 검사 후 등록 가능한 다이얼로그 창을 띄운다.
	private static final int THREAD_CHECK_DUPLICATION_AVAILABLE = 107;
	
	// Group Name 중복 검사 후 등록 불가능 다이얼로그 창을 띄운다.
	private static final int THREAD_CHECK_DUPLICATION_UNAVAILABLE = 108;
	
	// Group Name 중복 검사 오류가 발생 다이얼로그 창을 띄운다.
	private static final int THREAD_CHECK_DUPLICATION_ERROR = 109;
	
	DayveGroupRest dayveGroupRest = new DayveGroupRest();
	DayveCommonRest dayveCommonRest = new DayveCommonRest();
	DayveCommon dayveCommon = new DayveCommon();


	// Group Name 중복 검사 결과.
	private String RESULT_CHECK_DUPLICATION = "";

	// Group Name 저장 결과.
	private String RESULT_GROUP_REGISTER = "";
		
	// 아이디.
	private String DAYVE_ID = "";

	// 중복 확인 버튼 눌렀는지 체크.
	private int CHECK_DUPLICATION  = 0;
	
	// 설정 파일을 가져 온다.
	private String myPreference = "kr.pe.johnkim.dayve.activity_preferences";
	
	/* (non-Javadoc)
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.dayve_group_register);
		
		confirmNotification();
		
		// 현재 시간을 가져 온다.
		currentDate = dayveCommon.getCurrentDate();
		
		// Progress Bar 를 정의 한다.
		registerGroupProgressBar = (ProgressBar)findViewById(R.id.registerGroupProgressBar);
		
		// 아이콘 선택 화살표.
		imgViewGroupIconSelect = (ImageView)findViewById(R.id.imgViewGroupIconSelect);
		imgViewGroupIconSelect.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent i = new Intent(DayveGroupRegisterView.this, DayveGroupSelectIconView.class);
				i.putExtra("parent_activity_name", "DayveGroupRegisterView");
				startActivityForResult(i, 0);
			}
			
		});
		
		// 아이콘 선택.
		imgViewRegisterGroupSelectIcon = (ImageView)findViewById(R.id.imgViewRegisterGroupSelectIcon);
		imgViewRegisterGroupSelectIcon.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent i = new Intent(DayveGroupRegisterView.this, DayveGroupSelectIconView.class);
				i.putExtra("parent_activity_name", "DayveGroupRegisterView");
				startActivityForResult(i, 0);
			}
			
		});
		
		// Group Name 입력란을 정의 한다.
		edtTextRegisterGroupName = (EditText)findViewById(R.id.edtTextRegisterGroupName);
		
		// 입력된 comment 글자 수를 체크 한다.
		txtViewRegisterGroupCommentCount = (TextView)findViewById(R.id.txtViewRegisterGroupCommentCount);
		
		TextWatcher watcher = new TextWatcher() {
			
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				// TODO Auto-generated method stub
				int cnt = s.toString().length();
				txtViewRegisterGroupCommentCount.setText(String.valueOf(cnt));
				
			}
			
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO Auto-generated method stub
				
			}
			
			public void afterTextChanged(Editable s) {
				// TODO Auto-generated method stub
				
			}
		};
		
		// Group Name 중복 확인 버튼을 정의 한다.
		btnCheckDuplicationRegisterGroup = (Button)findViewById(R.id.btnCheckDuplicationRegisterGroup);
		btnCheckDuplicationRegisterGroup.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				// 중복 확인 버튼 눌렀을때 확인 값을 증가 시킨다.
				CHECK_DUPLICATION++;
				
				if(("").equals(edtTextRegisterGroupName.getText().toString().trim())) {
					new AlertDialog.Builder(DayveGroupRegisterView.this)
					.setTitle("그룹명 중복 확인.")
					.setMessage("그룹명을 입력 하세요.")
					.setPositiveButton("확인", 
						new DialogInterface.OnClickListener() {
							
//							@Override
							public void onClick(DialogInterface dialog, int which) {
								// TODO Auto-generated method stub
							}
						}).show();
				} else {
					// 중복 검사를 한다.
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION));
				}
			}
			
		});
		
		// Group Comment 입력란을 정의 한다.
		edtTextRegisterGroupComment = (EditText)findViewById(R.id.edtTextRegisterGroupComment);
		
		// 입력된 글자수 확인을 세팅 한다.
		edtTextRegisterGroupComment.addTextChangedListener(watcher);
		
		// Group 등록 버튼을 정의 한다.
		btnRegisterGroup = (Button)findViewById(R.id.btnRegisterGroup);
		
		btnRegisterGroup.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(("").equals(edtTextRegisterGroupName.getText().toString().trim())) {
					new AlertDialog.Builder(DayveGroupRegisterView.this)
					.setTitle("그룹명 중복 확인.")
					.setMessage("그룹명을 입력 하세요.")
					.setPositiveButton("확인", 
						new DialogInterface.OnClickListener() {
							
//							@Override
							public void onClick(DialogInterface dialog, int which) {
								// TODO Auto-generated method stub
							}
						}).show();
				} else if(CHECK_DUPLICATION == 0) {
					new AlertDialog.Builder(DayveGroupRegisterView.this)
					.setTitle("그룹명 등록 확인.")
					.setMessage("중복 확인을 하세요.")
					.setPositiveButton("확인", 
						new DialogInterface.OnClickListener() {
							
//							@Override
							public void onClick(DialogInterface dialog, int which) {
								// TODO Auto-generated method stub
							}
						}).show();
				} else {
					// group 을 등록 한다.
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_GROUP_REGISTER));
				}
			}
			
		});
		
		
		
		
		
	}
	
	/**
	 * Handler 를 등록 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			// Group Name 중복 검사를 한다.
			case THREAD_CHECK_DUPLICATION : 
				threadCheckDuplication();
				break;
			// Group 을 등록 한다.
			case THREAD_GROUP_REGISTER : 
				threadRegisterGroup();
				break;
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				registerGroupProgressBar.setVisibility(View.VISIBLE);
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				registerGroupProgressBar.setVisibility(View.INVISIBLE);
				break;
			// Group 저장 성공하면 토스트를 띄운다.
			case THREAD_PROGRESS_REGISTER_SUCCESS : 
				showRegisterCategoryToast();
				break;
			// Group 저장 실패하면 오류발생 다이얼로그 창을 띄운다.
			case THREAD_PROGRESS_REGISTER_FAIL : 
				showDialogRegisterCategoryFail();
				break;
			// Group Name 중복 검사 후 등록 가능한 다이얼로그 창을 띄운다.
			case THREAD_CHECK_DUPLICATION_AVAILABLE : 
				showDialogCheckDuplicationAvailable();
				break;
			// Group Name 중복 검사 후 등록 불가능 다이얼로그 창을 띄운다.
			case THREAD_CHECK_DUPLICATION_UNAVAILABLE : 
				showDialogCheckDuplicationUnavailable();
				break;
			// Group Name 중복 검사 오류가 발생 다이얼로그 창을 띄운다.
			case THREAD_CHECK_DUPLICATION_ERROR : 
				showDialogCheckDuplicationError();
				break;
			}
		}
	};
	
	/**
	 * SharedPreferences 정보를 확인 한다.
	 */
	public void confirmNotification() {
		String myPf = "kr.pe.johnkim.dayve.activity_preferences";
		SharedPreferences mSharedPreferences = getSharedPreferences(myPf, Activity.MODE_PRIVATE);
		
		// id 를 가져 온다.
		DAYVE_ID = mSharedPreferences.getString("dayve_id", "");
	}
	
	/* 화면을 출력하면 로그를 저장 한다.
	 * 
	 * @see android.app.Activity#onResume()
	 */
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
		// 중복 확인 버튼을 했는지 확인하기 위한 체크 값을 초기화 한다.
		CHECK_DUPLICATION = 0;
		
		// 화면이 출력되면서 아이콘 이미지를 세팅 한다.
		int lid = this.getResources().getIdentifier(DAYVE_GROUP_ICON_NAME, "drawable", this.getPackageName());
		imgViewRegisterGroupSelectIcon.setImageResource(lid);

		// main thread 에서 child thread 를 호출 한다.
		Thread thread = new Thread(null, insertLogBackgroundThreadProcessing, "Background_insertLog");
		thread.start();
	}
	
	/* (non-Javadoc)
	 * @see android.app.Activity#onStop()
	 */
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
//		finish();
	}
	
	/**
	 * 만약 뒤로 가기가 가능하다면 등록 화면을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		super.onBackPressed();
		finish();
	}
	
	/**
	 * Group Name 중복 검사를 한다.
	 * 
	 * 실제 checkDuplication 메소드에서 처리 한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadCheckDuplication() {
		Log.i(TAG, "threadCheckDuplication");
	
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				checkDuplication();
			}
			
		});
		
		thread.start();
	}
	
	private void checkDuplication() {
		Log.i(TAG, "checkDuplication");
		
		DayveGroup parameterGroup = new DayveGroup();
		
		parameterGroup.setName(edtTextRegisterGroupName.getText().toString().trim());
		parameterGroup.setActivateYn("Y");
		parameterGroup.setMyHistoryMembersId(DAYVE_ID);
		
		try {
			RESULT_CHECK_DUPLICATION = dayveGroupRest.checkDuplication(parameterGroup).getCount();
			
			Log.i(TAG, "RESULT_CHECK_DUPLICATION : " + RESULT_CHECK_DUPLICATION);
			
			// 처리가 끝나면 프로그레스 바를 감춘다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 중복 검사 결과에 따라 다이얼로그 창을 띄운다.
		 * 
		 * 1. 카테고리명 등록 가능한 경우.
		 * 2. 이미 등록되어 있는 경우.
		 * 3. 중복 검사시 오류 발생하는 경우.
		 */
		if(("0").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_AVAILABLE));
		} else if(("1").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_UNAVAILABLE));
		} else if(("null").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_ERROR));
		} else if(("ERROR").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_ERROR));
		}
	}
	
	/**
	 * Group Name 중복 검사 후 등록 가능한 다이얼로그 창을 띄운다.
	 */
	private void showDialogCheckDuplicationAvailable() {
		Log.i(TAG, "showDialogCheckDuplicationAvailable");
		
		new AlertDialog.Builder(DayveGroupRegisterView.this)
		.setTitle("그룹명 중복 확인.")
		.setMessage("등록 가능한 그룹명 입니다.")
		.setPositiveButton("확인", 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Group Name 중복 검사 후 등록 불가능 다이얼로그 창을 띄운다.
	 * 
	 * 카테고리명 입력란을 지운다.
	 */
	private void showDialogCheckDuplicationUnavailable() {
		Log.i(TAG, "showDialogCheckDuplicationUnavailable");
		
		new AlertDialog.Builder(DayveGroupRegisterView.this)
		.setTitle("그룹명 중복 확인.")
		.setMessage("이미 등록하신 그룹명 입니다.")
		.setPositiveButton("확인", 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
		
		edtTextRegisterGroupName.setText("");
	}
	
	/**
	 * Group Name 중복 검사 오류가 발생 다이얼로그 창을 띄운다.
	 */
	private void showDialogCheckDuplicationError() {
		Log.i(TAG, "showDialogCheckDuplicationError");
		
		new AlertDialog.Builder(DayveGroupRegisterView.this)
		.setTitle("그룹명 중복 확인.")
		.setMessage("중복 확인에 실패했습니다." + "\n" + "다시 시도해 주시기 바랍니다.")
		.setPositiveButton("확인", 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Group 을 등록 한다.
	 * 
	 * 실제 registerCategory 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadRegisterGroup() {
		Log.i(TAG, "threadRegisterGroup");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				registerGroup();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Group 을 등록 한다.
	 */
	private void registerGroup() {
		Log.i(TAG, "registerGroup");
		
		DayveGroup parameterGroup = new DayveGroup();
		
		parameterGroup.setName(edtTextRegisterGroupName.getText().toString().trim());
		parameterGroup.setComment(edtTextRegisterGroupComment.getText().toString());
		parameterGroup.setIconUrl(DAYVE_GROUP_ICON_NAME);
		parameterGroup.setOpenGroupYn("N");
		parameterGroup.setFavoriteYn("N");
		parameterGroup.setActivateYn("Y");
		parameterGroup.setModifyDate(currentDate);
		parameterGroup.setRegisterDate(currentDate);
		parameterGroup.setMyHistoryMembersId(DAYVE_ID);
		
		Log.i(TAG, "name               : " + parameterGroup.getName());
		Log.i(TAG, "comment            : " + parameterGroup.getComment());
		Log.i(TAG, "iconUrl            : " + parameterGroup.getIconUrl());
		Log.i(TAG, "openGroupYn        : " + parameterGroup.getOpenGroupYn());
		Log.i(TAG, "favoritgeYn        : " + parameterGroup.getFavoriteYn());
		Log.i(TAG, "activateYn         : " + parameterGroup.getActivateYn());
		Log.i(TAG, "modifyDate         : " + parameterGroup.getModifyDate());
		Log.i(TAG, "registerDate       : " + parameterGroup.getRegisterDate());
		Log.i(TAG, "myHistoryMembersId : " + parameterGroup.getMyHistoryMembersId());
		
		try {
			RESULT_GROUP_REGISTER = dayveGroupRest.registerGroup(parameterGroup).getResult();
			
			Log.i(TAG, "RESULT_GROUP_REGISTER : " + RESULT_GROUP_REGISTER);
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 등록 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 등록에 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 등록에 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_GROUP_REGISTER)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_REGISTER_SUCCESS));
			
			DayveGroupView.RESULT_GROUP_REGISTER = "SUCCESS";
			DayveGroupView.GROUP_MODE = "PROCESS";
			
			
			
			
			
			
			Intent i = new Intent();
			setResult(RESULT_OK, i);
			
			
			
			
			
			
			
			/**
			 * category 를 등록한뒤 intent 로 생성하면 main 페이지가 사라진다.
			 * 등록 성공하면 본 register 페이지만 닫는다.
			 */
			// category 목록 화면으로 이동 한다.
//			Intent dayveMainView = new Intent(DayveCategoryRegisterView.this, DayveCategoryView.class);
//			startActivity(dayveMainView);
			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_REGISTER_FAIL));
		}
		
		DAYVE_GROUP_ICON_NAME = "dayve_group_default";
	}
	
	/**
	 * Group 등록 실패 다이얼로그 창을 띄운다.
	 */
	private void showDialogRegisterCategoryFail() {
		Log.e(TAG, "showDialogRegisterCategoryFail");
		
		new AlertDialog.Builder(DayveGroupRegisterView.this)
		.setTitle("그룹 등록 확인.")
		.setMessage("그룹 등록에 실패 했습니다." + "\n" + "다시 시도해 주시기 바랍니다.")
		.setPositiveButton("확인", 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Group 등록 성공 Toast 를 띄운다.
	 */
	private void showRegisterCategoryToast() {
		CharSequence text = "그룹 등록 성공";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * 로그를 저장 한다.
	 */
	private void insertLog() {
		Log.i(TAG, "insertLog");
		
		DayveLog dayveLog = new DayveLog();
		
		dayveLog.setId(DAYVE_ID);
		dayveLog.setViewName(TAG);
		dayveLog.setAccessDate(currentDate);
		
		try {
			dayveCommonRest.registerLog(dayveLog);
			Log.i(TAG, "Success to insert log.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		}
	}
	
	/**
	 * 로그 저장은 UI 와 관계 없기 때문에 background thread 로 구현 함 : child thread
	 */
	private Runnable insertLogBackgroundThreadProcessing = new Runnable() {
		
		public void run() {
			// TODO Auto-generated method stub
			insertLog();
		}
	};
	
}
